﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorCase.h
 * @brief  Abaqus 适配器 用于读取INP文件和写出INP文件。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-03-15
 *
 *********************************************************************/
#ifndef __FITKABAQUSADAPTORCASE_R_H__
#define __FITKABAQUSADAPTORCASE_R_H__

#include "FITKAbaqusAbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKAbaqusPart)
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaMaterial)
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(Interface, FITKAbaAbstractStep)
ForwardDeclarNS(Interface, FITKAbaAbstractAmplitude)

namespace IO
{
    /**
     * @brief Abaqus INP 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-03-15
     */
    class FITKAbaqusAdaptorCase : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorCase() = default;
        ~FITKAbaqusAdaptorCase() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString getAdaptorClass() override;

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool adaptW() override;


    private:

        /**
         * @brief 读取头信息
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-08
         */
        bool readHeading();

        /**
         * @brief 读取Preprint
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-08
         */
        bool readPreprint();

        /**
         * @brief 读取部件（Part）结构
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool readPart();

        /**
         * @brief 读取装配（Assembly）结构
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool readAssembly();

        /**
         * @brief 读取材料（Material）结构
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-20
         */
        bool readMaterial();

        /**
         * @brief 读取幅值(Amplitude)曲线
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-03
         */
        bool readAmplitude();

        /**
         * @brief 读取相互作用属性
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-19
         */
        bool readInteractionProperty();

        /**
         * @brief 读取初始分析步中的边界(Boundary)条件
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-10
         */
        bool readInitialBoundary();

        /**
         * @brief 读取分析步中的相互作用(Interaction)条件
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-10
         */
        bool readInteraction();

        /**
         * @brief 读取连接器行为
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-25
         */
        bool readConnectorBehavior();

        /**
         * @brief 读取分析步（Step）结构
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool readStep();

        /**
         * @brief 读取时间点
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readTimePoints();

        /**
         * @brief 读取预定义场
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-04
         */
        bool readInitialConditions();

        /**
         * @brief 写出Heading信息
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-18
         */
        bool writeHeading();

        /**
         * @brief 写出Preprint
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-08
         */
        bool writePreprint();

        /**
         * @brief 写出Part结构
         * @param apart 部件
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-25
         */
        bool writePart(AbaqusData::FITKAbaqusPart* part);

        /**
         * @brief 写出Assembly结构
         * @param assembly 装配
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-25
         */
        bool writeAssembly(Interface::FITKAbaAssembly* assembly);

        /**
         * @brief 写出Material结构
         * @param material 材料
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-25
         */
        bool writeMaterial(Interface::FITKAbaMaterial* material);

        /**
         * @brief 写出幅值(Amplitude)曲线
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-03
         */
        bool writeAmplitude(Interface::FITKAbaAbstractAmplitude* amplitude);

        /**
         * @brief 写出初始分析步中的边界(Boundary)条件
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-10
         */
        bool writeInitialBoundary();

        /**
         * @brief 写出预定义场
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-04
         */
        bool writeInitialConditions();

        /**
         * @brief 写出相互作用属性
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-22
         */
        bool writeInteractionProperty();

        /**
         * @brief 写出相互作用
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-23
         */
        bool writeInteraction();

        /**
         * @brief 写出连接器行为
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-27
         */
        bool writeConnectorBehavior();

        /**
         * @brief 写出分析步（Step）结构
         * @param step 分析步
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool writeStep(Interface::FITKAbaAbstractStep* step);

        /**
         * @brief 写出时间点
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool writeTimePoints();

        /**
         * @brief 写出时 计算进度 预计分配 
         * @param step 步骤 1 part 2 assembly 3 material 4 step
         * @param count 当前步骤的总个数
         * @param index 当前步骤的第几个
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        void sendCalculateProgress(int step, int count, int index);

    private:

        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        AbaqusData::FITKDataCase* _caseData{};

        /**
         * @brief 算例描述
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString _caseDecription;

        /**
         * @brief Preprint下的属性信息
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool _echo = false;
        /**
         * @brief Preprint下的属性信息
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool _model = false;
        /**
         * @brief Preprint下的属性信息
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool _history = false;
        /**
         * @brief Preprint下的属性信息
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool _contact = false;

    };

    Register2FITKIOAdaptorFactory(INP, AbaqusData::FITKDataCase, FITKAbaqusAdaptorCase)
}


#endif // !1

